package com.mycat.io.bio;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * BIO 服务端。
 * 同步阻塞IO。
 * 数据面向-流。
 * accept(),read()都是阻塞方法。如果服务端不采用多线程编程，服务端则只能连接一个客户端。
 * 采用多线程编程，每一个客户端需要创建一个线程，当客户端呈线性增长时，服务端点线程数量也呈线性增长，服务端线程数量与客户端数量为1:1。
 * 当客户端数量太多会导致服务器卡死、宕机。
 * @author roger.
 * @email 190642964@qq.com
 * @create 2017-02-17
 */
public class BIOServer {
    int port;
    ServerSocket server;

    public BIOServer(int port) {
        this.port = port;
        try {
            server = new ServerSocket(port);
            System.out.println("BIO服务已启动..监听端口：" + this.port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void listener() throws IOException {
        int i = 0;
        while (true) {
            i++;
            System.out.println("BIOServer 第[" + i + "]次进入while循环.....");
            System.out.println("BIOServer 开始等待客户端连接......");
            Socket client = server.accept();
            System.out.println("BIOServer 确认收到客户端连接......" + client.getInetAddress() + "  / " + client.getPort());

            InputStream input = client.getInputStream();

            int j = 0;
            while (true) {
                j++;
                byte[] buff = new byte[1024];
                System.out.println("BIOServer " + client.getInetAddress() + "  / " + client.getPort() + " ....第[" + j + "]次 等待读取 客户端收到的数据.......");
                int len = input.read(buff);
                System.out.println("BIOServer " + client.getInetAddress() + "  / " + client.getPort() + " ....第[" + j + "]次 确定收到 客户端收到的数据.......");
                if (len > 0) {
                    String message = new String(buff, 0, len);
                    System.out.println("服务端收到数据： " + message);
                }
            }

        }
    }

    public static void main(String[] args) {
        try {
            new BIOServer(8888).listener();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}
